function oAppletEngine(engine) {
  this.engine = engine;
}

oAppletEngine.prototype = {
  // 判断是否是小程序句柄
  handle: function () {
    if (typeof wx != "undefined") {
      return wx;
    } else if (typeof my != "undefined") {
      return my;
    } else {
      return null;
    }
  },
  // 小程序 能力接口 Web-View JS SDK 文档：https://developers.weixin.qq.com/miniprogram/dev/component/web-view.html
  // 公众号 JS SDK 文档：https://developers.weixin.qq.com/doc/offiaccount/OA_Web_Apps/JS-SDK.html
  ability: function (method, arg) {
    let o = this;
    return new Promise(async (resolve, reject) => {
      // 判断是否是小程序
      if (o.handle()) {
        // 获取小程序对象
        let obj = o.handle();
        // 如果obj里面有该方法 就调用该方法 如果没有就远程交互
        if (obj[method]) {
          obj[method]({
            ...arg,
            success(response) {
              resolve(response)
            },
            fail(err) {
              reject(err)
            }
          })
        }
      } else {
        // 如果不是小程序，则不处理。
      }
    });
  },
  // 退出函数，兼容 微信 和 支付宝，调用后直接跳转到 小程序 登陆页。
  logout: function () {
    // 平台登陆信息清空
    this.engine.passport.appKey = "";
    this.engine.passport.token = "";
    this.engine.passport.password = "";
    localStorage.removeItem('user_passport');

    // 下面是原来GD的代码，可能是支付宝退出。
    // this.postAppletMessage({
    //   pageTo: 'Main'
    // });

    if (this.isWeChatApplet()) {
      // 丢失权限，跳转回微信登陆页，小程序登陆页收到 isLogin=no 标识后，删除登陆数据。
      this.engine.applet.wxRedirectTo('/pages/login/index?isLogin=no');
    } else if (this.isAliPayApplet()) {
      // 阿里执行退出的方法，以下方法是GD实现，需要核实。
      // localStorage.removeItem('userInfo');
      // this.postAppletMessage({
      //   pageTo: 'Main'
      // });
    }
  },

  //判断支付宝小程序
  isAliPayApplet: function () {
    return new Promise(res => {
      my.getEnv(({miniprogram}) => {
        if (!miniprogram) {
          res(false)
        } else {
          res(true)
        }
      });
    })
  },
  //判断微信小程序
  isWeChatApplet: function () {
    return new Promise(res => {
      if (window['__wxjs_environment'] === "miniprogram") {
        res(true)
      } else {
        wx.miniProgram.getEnv(function ({miniprogram}) {
          if (!miniprogram) {
            res(false)
          } else {
            res(true)
          }
        })
      }
    })
  },
  config: function (jsApiList, successCallback, failCallback) {
    window.my ? this.aliPayConfig(successCallback) : this.wechatConfig(false, jsApiList, successCallback, failCallback);
  },
  // 微信高级功能 须使用 wx.config 的 jsApiList 去拿权限，然后才能使用。
  wechatConfig: function (debug, jsApiList, successCallback, failCallback) {
    let o = this;
    // 获取url地址，后续将对这个地址进行签名。
    let signUrl = location.href.split("#")[0];
    // let signUrl = location.origin;
    // let signUrl = location.host + "/main/app/campus/login";
    // 对地址进行编码，切记后台使用公众号
    signUrl = encodeURIComponent(signUrl);
    // console.log(signUrl);
    // let signUrl = location.href.split("?")[0];
    this.engine.request.api.post("/ESB/Applet/WeChat/Signature", {
      url: signUrl
    }, function (res) {
      if (res.status.code == 200) {
        console.log(JSON.stringify(res));
        wx.config({
          debug,
          appId: res.content.appID,
          timestamp: res.content.timestamp,
          nonceStr: res.content.nonceStr,
          signature: res.content.signature,
          jsApiList
        });
        wx.ready(() => {
          // console.log("wx.signature success."); // 貌似成功不成功，都会调用该方法。。。
          if (successCallback) {
            successCallback(res);
          }
        });
      } else {
        console.log(JSON.stringify(res));
        // console.log("wx.signature error.");
        // 此处返回请求签名的异常
        if (failCallback) {
          failCallback(res);
        }

        // 此处返回 wx.config的异常
        wx.error(function () {
          console.log("wx.config error.");
          if (failCallback) {
            failCallback({code: 500, msg: "wx.config 出现异常。"});
          }
        });
      }
    })
  },
  // 阿里配置
  aliPayConfig: function (successCallback) {
    successCallback && successCallback();
  },
  setTitle: function (data) {
    document.title = data;
    this.engine.request.localstorage.set("title", data);
  },
  getTitle() {
    return this.engine.request.localstorage.get("title");
  },
  ///////////////////////////// 以下代码未经过整理 /////////////////////////////
  async wxReLaunch(p) {
    let appletMethods = await this.appletMethods()
    appletMethods.reLaunch({
      url: p
    });
  }
  ,
  async wxRedirectTo(p) {
    let appletMethods = await this.appletMethods()
    appletMethods.redirectTo({
      url: p
    });
  }
  ,
  async wxNavgateTo(p) {
    let appletMethods = await this.appletMethods()
    appletMethods.navigateTo({
      url: p
    });
  }
  ,
  async postAppletMessage(params, fun) {
    let appletMethods = await this.appletMethods();
    // window.history.go(-1);
    appletMethods.postMessage({
      data: params
    })
    if (window.my) {
      window.my.onMessage = function (e) {
        fun && fun(e);
      }
    }
  }
  ,
  async wxBack() {
    let appletMethods = await this.appletMethods()
    appletMethods.navigateBack()
  }
  ,
// 获取Applet模式
  async appletMethods() {
    if (window.my) {
      let res = await this.isAliPayApplet();
      return res ? my : '';
    } else {
      let res = await this.isWeChatApplet();
      return res ? wx.miniProgram : '';
    }
  }
  ,
  async backToRefesh(pageTo) {
    let appletMethods = await this.appletMethods();
    if ('getLocation' in appletMethods) {
      this.postAppletMessage({
        pageTo,
      });
    } else {
      this.postAppletMessage({
        pageTo,
      });
      window.history.go(-1);
      this.wxBack()
    }
  }
  ,
  async noLoginToPage(_) {
    if (!_.isLogin) {
      let res = await _.$dialog.confirm({
        title: '您还未登录',
        message: '请先登录再进行操作',
        showConfirmButton: true,
        showCancelButton: true,
        confirmButtonText: '立即登录',
        cancelButtonText: '暂不登录',
        confirmButtonColor: '#000',
        cancelButtonColor: 'red'
      })
      res == 'confirm' && this.engine.applet.wxNavgateTo('/pages/login/index');
    }
    return _.isLogin;
  }
  ,
//计算距离
  getDisance(lat1, lng1, lat2, lng2) {
    let dis = 0;
    let radLat1 = toRad(lat1);
    let radLat2 = toRad(lat2);
    let deltaLat = radLat1 - radLat2;
    let deltaLng = toRad(lng1) - toRad(lng2);
    dis = 2 * Math.asin(Math.sqrt(Math.pow(Math.sin(deltaLat / 2), 2) + Math.cos(radLat1) * Math.cos(radLat2) * Math.pow(Math.sin(deltaLng / 2), 2)));
    return dis * 6378137;

    function toRad(d) {
      return d * Math.PI / 180;
    }
  }
  ,
  gcj02towgs84(lng, lat) {
    var PI = 3.1415926535897932384626;
    var a = 6378245.0; //卫星椭球坐标投影到平面地图坐标系的投影因子。
    var ee = 0.00669342162296594323; //椭球的偏心率。
    function transformlat(lng, lat) {
      var ret = -100.0 + 2.0 * lng + 3.0 * lat + 0.2 * lat * lat + 0.1 * lng * lat + 0.2 * Math.sqrt(Math.abs(lng));
      ret += (20.0 * Math.sin(6.0 * lng * PI) + 20.0 * Math.sin(2.0 * lng * PI)) * 2.0 / 3.0;
      ret += (20.0 * Math.sin(lat * PI) + 40.0 * Math.sin(lat / 3.0 * PI)) * 2.0 / 3.0;
      ret += (160.0 * Math.sin(lat / 12.0 * PI) + 320 * Math.sin(lat * PI / 30.0)) * 2.0 / 3.0;
      return ret
    }

    function transformlng(lng, lat) {
      var ret = 300.0 + lng + 2.0 * lat + 0.1 * lng * lng + 0.1 * lng * lat + 0.1 * Math.sqrt(Math.abs(lng));
      ret += (20.0 * Math.sin(6.0 * lng * PI) + 20.0 * Math.sin(2.0 * lng * PI)) * 2.0 / 3.0;
      ret += (20.0 * Math.sin(lng * PI) + 40.0 * Math.sin(lng / 3.0 * PI)) * 2.0 / 3.0;
      ret += (150.0 * Math.sin(lng / 12.0 * PI) + 300.0 * Math.sin(lng / 30.0 * PI)) * 2.0 / 3.0;
      return ret
    }

    var dlat = transformlat(lng - 105.0, lat - 35.0);

    var dlng = transformlng(lng - 105.0, lat - 35.0);

    var radlat = lat / 180.0 * PI;

    var magic = Math.sin(radlat);

    magic = 1 - ee * magic * magic;

    var sqrtmagic = Math.sqrt(magic);

    dlat = (dlat * 180.0) / ((a * (1 - ee)) / (magic * sqrtmagic) * PI);

    dlng = (dlng * 180.0) / (a / sqrtmagic * Math.cos(radlat) * PI);

    var mglat = lat + dlat;
    var mglng = lng + dlng;

    return [lng * 2 - mglng, lat * 2 - mglat]

  }
  ,
  /**
   *
   * @param {*} lng
   * @param {*} lat
   * @return {lng,lat}
   */
  wgs84_to_gcj02(lng, lat) {
    var PI = 3.1415926535897932384626;
    var a = 6378245.0; //卫星椭球坐标投影到平面地图坐标系的投影因子。
    var ee = 0.00669342162296594323; //椭球的偏心率。

    function transformlat(lng, lat) {
      var ret = -100.0 + 2.0 * lng + 3.0 * lat + 0.2 * lat * lat + 0.1 * lng * lat + 0.2 * Math.sqrt(Math.abs(lng));
      ret += (20.0 * Math.sin(6.0 * lng * PI) + 20.0 * Math.sin(2.0 * lng * PI)) * 2.0 / 3.0;
      ret += (20.0 * Math.sin(lat * PI) + 40.0 * Math.sin(lat / 3.0 * PI)) * 2.0 / 3.0;
      ret += (160.0 * Math.sin(lat / 12.0 * PI) + 320 * Math.sin(lat * PI / 30.0)) * 2.0 / 3.0;
      return ret
    }

    function transformlng(lng, lat) {
      var ret = 300.0 + lng + 2.0 * lat + 0.1 * lng * lng + 0.1 * lng * lat + 0.1 * Math.sqrt(Math.abs(lng));
      ret += (20.0 * Math.sin(6.0 * lng * PI) + 20.0 * Math.sin(2.0 * lng * PI)) * 2.0 / 3.0;
      ret += (20.0 * Math.sin(lng * PI) + 40.0 * Math.sin(lng / 3.0 * PI)) * 2.0 / 3.0;
      ret += (150.0 * Math.sin(lng / 12.0 * PI) + 300.0 * Math.sin(lng / 30.0 * PI)) * 2.0 / 3.0;
      return ret
    }

    /**
     * 判断是否在国内，不在国内则不做偏移
     * @param lng
     * @param lat
     * @returns {boolean}
     */
    function out_of_china(lng, lat) {
      return (lng < 72.004 || lng > 137.8347) || ((lat < 0.8293 || lat > 55.8271) || false);
    }

    if (out_of_china(lng, lat)) {
      return [lng, lat]
    } else {
      var dlat = transformlat(lng - 105.0, lat - 35.0);
      var dlng = transformlng(lng - 105.0, lat - 35.0);
      var radlat = lat / 180.0 * PI;
      var magic = Math.sin(radlat);
      magic = 1 - ee * magic * magic;
      var sqrtmagic = Math.sqrt(magic);
      dlat = (dlat * 180.0) / ((a * (1 - ee)) / (magic * sqrtmagic) * PI);
      dlng = (dlng * 180.0) / (a / sqrtmagic * Math.cos(radlat) * PI);
      var mglat = lat + dlat;
      var mglng = lng + dlng;
      return [mglng, mglat]
    }
  }
  ,

}

export {
  oAppletEngine
}


